import router from '@/router'
import { useAuthStore } from '@/store'
import axios, { AxiosRequestConfig } from 'axios'
import { ElMessage } from 'element-plus'

const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL
})

// 请求拦截器
request.interceptors.request.use(function (config) {
  // 统一设置用户身份 token
  const authStore = useAuthStore()
  const token = authStore.getToken // 获取存储在 Pinia store 的 token
  if (token) {
    config.headers.Authorization = `Bearer ${token}` // 把 token 添加到请求头
  }
  return config
}, function (error) {
  // Do something with request error
  return Promise.reject(error)
})

// 控制登录过期的锁
let isRefreshing = false

// 响应拦截器
request.interceptors.response.use(function (response) {
  const status = response.data.status

  // 正确的情况
  if (!status || status === 200) {
    return response
  }

  // 错误情况：比如 token 无效...

  // 统一处理登录过期
  if (status === 14000) {
    if (isRefreshing) return Promise.reject(response)
    isRefreshing = true
    // 清除本地过期的登陆状态
    // 清除 token
    const authStore = useAuthStore()
    authStore.clearToken()

    // 跳转到登录页面
    router.push({
      name: 'login',
      query: {
        redirect: router.currentRoute.value.fullPath
      }
    })
    isRefreshing = false

    // 抛出异常
    return Promise.reject(response)
  }

  // 其他错误情况
  ElMessage.error(response.data.msg || '请求失败，请稍后重试')
  // 手动返回一个 promise 异常
  return Promise.reject(response)

  // // 统一处理接口响应错误，比如 token 过期无效、服务端异常等
  // if (response.data.status && response.data.status !== 200) {
  //   ElMessage.error(response.data.msg || '请求失败，请稍后重试')
  //   // 手动返回一个 promise 异常
  //   return Promise.reject(response.data)
  // }
  // return response
}, function (error) {
  // 对响应错误做点什么
  if (error.response) {
    // 请求已发出，但服务器响应的状态码不在 2xx 范围内
    console.error('Error status', error.response.status)

    const status = error.response.status
    if (status === 404) {
      ElMessage.error('请求的资源未找到')
    } else if (status === 401) {
      ElMessage.error('认证失败，可能是由于 token 过期或无效')
      // 你可能还要进行页面跳转到登录页面逻辑，例如：
      // router.replace({ name: 'login' });
    } else {
      ElMessage.error('请求失败，请稍后重试')
    }
  } else {
    // 一些触发错误的其它处理
    ElMessage.error(error.message || '请求失败，无法连接到服务器')
  }

  return Promise.reject(error)
})

export default <T = any>(config: AxiosRequestConfig) => {
  return request(config).then(res => {
    return res.data as T
  })
}
